; void gris_epsilon_uno_asm(unsigned char *src, unsigned char *dst, int h, int w, int src_row_size, int dst_row_size)

section .data
%define 	src		[ebp+8]		
%define 	dst		[ebp+12]	
%define 	h		[ebp+16] 	 
%define 	w		[ebp+20] 	
%define 	srcRow 		[ebp+24] 	
%define	        dstRow		[ebp+28] 	
mask :  db   01h,04h,07h,0Ah,0Dh,80h,80h,80h,80h,80h,80h,80h,80h,80h,80h,80h
section .text


global gris_epsilon_uno_asm

gris_epsilon_uno_asm:
	push ebp	
	mov ebp,esp
	pushad
	mov esi,src
	mov edi,dst
	mov eax,h	
	mov ebx,srcRow
	mul ebx			;eax = cantidad de bytes de src
ciclo:  
	movdqu xmm0,[esi]	;muevo los primeros 5 bits a color en xmm0 voy a desempacar la parte baja
	movdqa xmm1,xmm0	;en xmm1 voy a desempacar la parte alta
	movdqa xmm2,xmm0	;en xmm2 voy a desempacar la parte baja despues de shiftear uno a la izquierda
	movdqa xmm3,xmm0	;en xmm3 voy a desempacar la parte alta despues de shiftear uno a la izquierda

	PSRLDQ xmm2,1
	PSRLDQ xmm3,1
	
	pxor xmm7,xmm7	
	punpcklbw xmm0,xmm7
	punpcklbw xmm2,xmm7 			
	
	paddw xmm0,xmm2

	movdqa xmm2,xmm0
	PSLLDQ xmm0,2
	PADDW xmm0,xmm2

	punpckhbw xmm1,xmm7
	punpckhbw xmm3,xmm7
	PADDW xmm1,xmm3

	movdqa xmm3,xmm1
	PSLLDQ xmm3,2
	PADDW xmm1,xmm3

	PSRAW xmm1,2
	PSRAW xmm0,2
	PACKUSWB XMM0,XMM1

	movdqu xmm3,[mask]
	PSHUFB xmm0,xmm3
	movdqu [edi],xmm0

   	sub eax,15
	add edi,5
	add esi,15
	cmp eax,15
	jge ciclo

cicloB:	cmp eax,0
	je fin	
	xor ebx,ebx
	xor ecx,ecx
	xor edx,edx	
	mov bx,[esi]   ;azul?
	mov cx,[esi+1] ;verde?
	mov dx,[esi+2] ;rojo 
	sal ecx,1
	add ecx,ebx
	add ecx,edx
	sar ecx,2
	mov [edi],cx
	add edi,1
	add esi,3
	sub eax,3
	jmp cicloB

fin:	popad
        pop ebp
	ret
